#ifndef DEBUG_H__
#define DEBUG_H__

#include <stdio.h>
#include <assert.h>

extern FILE *log_fp;

#ifdef LOG_FILE
#	define Log_write(format, ...) fprintf(log_fp, format, ## __VA_ARGS__), fflush(log_fp)
#else
#	define Log_write(format, ...)
#endif

#define Log(format, ...) \
    do { \
        fprintf(stdout, "\33[1;34m[%s,%d,%s] " format "\33[0m\n", \
                __FILE__, __LINE__, __func__, ## __VA_ARGS__); \
        fflush(stdout); \
        Log_write("[%s,%d,%s] " format "\n", \
                __FILE__, __LINE__, __func__, ## __VA_ARGS__); \
    } while(0)

#define Assert(cond, ...) \
    do { \
        if(!(cond)) { \
            fflush(stdout); \
            fprintf(stderr, "\33[1;31m"); \
            fprintf(stderr, __VA_ARGS__); \
            fprintf(stderr, "\33[0m\n"); \
            assert(cond); \
        } \
    } while(0)

#define panic(format, ...) \
    Assert(0, format, ## __VA_ARGS__)

#define ERR(format, ...) fprintf(stdout, "\33[1;31m[%s,%d,%s] [Error] \33[0;31m" format "\33[0m\n", \
                __FILE__, __LINE__, __func__, ## __VA_ARGS__); \
                fflush(stdout); \
                *out = 1; \
                return 0;

#endif
